/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.vista.implementaciones;

import desarrollosoft.ghce.entidades.Imagen;
import desarrollosoft.ghce.vista.interfaces.Avisable;
import desarrollosoft.ghce.vista.interfaces.Estado;
import java.io.IOException;
import java.util.List;
import org.zkoss.bind.BindContext;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.image.AImage;
import org.zkoss.image.Image;
import org.zkoss.util.media.Media;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

/**
 *
 * @author ariel
 */
public class ControladoraVentanaCargaConsultaImagen {
    
    private Imagen imagenSeleccionada;
    private Estado estado;
    private List<Imagen> listaImagenes;
    private Avisable avisable;

    private org.zkoss.image.Image imagen;
    
    private String titulo;
    private String comentario;
    
    private boolean camposSoloLectura;
    
    @Init
    public void inicializar() {
        Execution ejecucion = Executions.getCurrent();
        imagenSeleccionada = (Imagen) ejecucion.getArg().get("imagen");
        estado = (Estado) ejecucion.getArg().get("estado");
        listaImagenes = (List<Imagen>) ejecucion.getArg().get("listaImagenes");
        avisable = (Avisable) ejecucion.getArg().get("avisable");
        
        if (estado.equals(Estado.CONSULTANDO)) {
            titulo = imagenSeleccionada.getTitulo();
            try {
                imagen = new AImage(titulo, imagenSeleccionada.getArchivoImagen());
            } catch (IOException ex) {
                Messagebox.show("Error al cargar imagen desde la base de datos");
                return;
            }
            comentario = imagenSeleccionada.getComentario();
            camposSoloLectura = true;
        } else if (estado.equals(Estado.MODIFICANDO)) {
            titulo = imagenSeleccionada.getTitulo();
            try {
                imagen = new AImage(titulo, imagenSeleccionada.getArchivoImagen());
            } catch (IOException ex) {
                Messagebox.show("Error al cargar imagen desde la base de datos");
                return;
            }
            comentario = imagenSeleccionada.getComentario();
            camposSoloLectura = false;
        } else if (estado.equals(Estado.CREANDO)) {
            camposSoloLectura = false;
        }
    }
    
    @NotifyChange("imagen")
    @Command("subirImagen")
    public void clickBotonSubirImagen(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) {
        UploadEvent eventoSubida = null;
        Object eventoSubidaObject = ctx.getTriggerEvent();
        if (eventoSubidaObject != null && (eventoSubidaObject instanceof UploadEvent)) {
            eventoSubida = (UploadEvent) eventoSubidaObject;
        }
        if (eventoSubida == null) {
            Messagebox.show("Error al subir la imagen, intente nuevamente", "Error", Messagebox.OK, Messagebox.ERROR);
            return;
        }
        Media media = eventoSubida.getMedia();
        if (media instanceof org.zkoss.image.Image) {
            imagen = (org.zkoss.image.Image) media;
        } else {
            Messagebox.show(media + "\nno es un archivo de imagen", "Error", Messagebox.OK, Messagebox.ERROR);
        }
    }
    
    @Command("guardar")
    public void clickBotonGuardar(@BindingParam("referencia") Window ventana) {
        if (estado.equals(Estado.CREANDO)) {
            if (validarCampos()) {
                Imagen imagenEntidad = new Imagen();
                imagenEntidad.setTitulo(titulo);
                imagenEntidad.setComentario(comentario);
                imagenEntidad.setArchivoImagen(imagen.getByteData());
                listaImagenes.add(imagenEntidad);
                avisable.seCerroVentanaHija(null);
                ventana.detach();
            }
        } else if (estado.equals(Estado.MODIFICANDO)) {
            if (validarCampos()) {
                imagenSeleccionada.setTitulo(titulo);
                imagenSeleccionada.setComentario(comentario);
                imagenSeleccionada.setArchivoImagen(imagen.getByteData());
                avisable.seCerroVentanaHija(null);
                ventana.detach();
            }
        }
    }

    @Command("salir")
    public void clickBotonSalir(@BindingParam("referencia") Window ventana) {
        avisable.seCerroVentanaHija(null);
        ventana.detach();
    }

    private boolean validarCampos() {
        if (titulo == null || titulo.length() == 0) {
            Messagebox.show("Recuerde ingresar un título");
            return false;
        }
        if (imagen == null) {
            Messagebox.show("Recuerde cargar una imagen");
            return false;
        }
        String tituloMayusculas = titulo.toUpperCase();
        for (Imagen imagenLista : listaImagenes) {
            if (imagenLista.getTitulo().toUpperCase().equals(tituloMayusculas)) {
                Messagebox.show("Este estudio ya tiene una imagen cargada con ese mismo título");
                return false;
            }
        }
        // comentario no me importa ??
        return true;
    }
    
    public Image getImagen() {
        return imagen;
    }

    public void setImagen(Image imagen) {
        this.imagen = imagen;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getComentario() {
        return comentario;
    }

    public void setComentario(String comentario) {
        this.comentario = comentario;
    }
    
    public boolean getCamposSoloLectura() {
        return camposSoloLectura;
    }
}
